package d4_BigDecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;  // 确保这行存在

public class BigDecimalDemo01 {
    public static void main(String[] args) {
        //目标: 学会处理浮点型运算失真的问题
        double a = 0.1;
        double b = 0.2;
        double c = a + b;
        System.out.println(c);//0.30000000000004

        //绝对不能用第一个构造器,因为第一个构造器
        //public BigDecimal(double val) 只是进行大数据处理,处理不了精度失真的问题
        //1、把两个数据包装成BigDecimal对象
        // a、 public BigDecimal(String val) : 这个可以处理失真的问题
        BigDecimal a1 = new BigDecimal(Double.toString(a));
        BigDecimal b1 = new BigDecimal(Double.toString(b));

        //b、阿里巴巴公司更推荐我们用valueOf方法包装浮点类型数据 BigDecimal对象
        //跟的做法本质是一样的
        BigDecimal a11 = BigDecimal.valueOf(a);
        BigDecimal b11 = BigDecimal.valueOf(b);//对  public BigDecimal(String val)  进行了封装

        //2、调用方法进行精度运算
        //BigDecimal c11 = a11.add(b11);// 加
        //BigDecimal c11 = a11.subtract(b11); // 减
        //BigDecimal c11 = a11.multiply(b11);// 乘
        BigDecimal c11 = a11.divide(b11);// 除

        //3、BigDecimal是处理精度运算的手段, 结果必须是基本数据类型
        //基本数据类型不需要进行跨栈到堆寻找,性能更好,这可能就是sun公司保留基本数据类型的原因
        double result = c11.doubleValue();
        System.out.println(result);

        System.out.println("--------------------------------");
        BigDecimal i = BigDecimal.valueOf(0.1);
        BigDecimal j = BigDecimal.valueOf(0.3);
        /**
         * 参数一: 除数
         * 参数二: 保留位数
         * 参数三: 舍入模式
         */

        //public BigDecimal divide(BigDecimal divisor, int scale , RoundingMode roundMode)
        BigDecimal k = i.divide(j, 2, RoundingMode.HALF_UP);
        System.out.println(k);

    }
}
